home *** CD-ROM | disk | FTP | other *** search
- /*
- * Die Funktionen Dateiausdrucken und SpielstaerkeAnzeige
- * von rz am 15/12/92 zusätzlich implementiert, ebenso
- * die Ausgabe des aktuellen Status in der Screenleiste
- */
-
- /* Brett.c */
-
- #include "Adt.h"
-
- extern void SpielstaerkeAnzeige(void);
-
- struct Ereignis * WarteEreignis();
- struct Zugstat * BesterZug();
-
- /* globales Spielbrett: */
- Figur s[ 9 ][ 9 ];
-
- /* Spielstärke: 2 = leicht, 3 = schwerer etc. */
- int Spielstaerke=2;
-
- main()
- {
- int i, j, spende;
- struct Ereignis *e;
- struct Zugstat *zs;
- Special sp;
-
- OeffneDisplay();
- if( !WillLaden( s, &sp ) ) {
-
- /* Spielbrett initialisieren: */
- s[ 1 ][ 1 ] = wturm; s[ 1 ][ 8 ] = sturm;
- s[ 2 ][ 1 ] = wspringer; s[ 2 ][ 8 ] = sspringer;
- s[ 3 ][ 1 ] = wlaeufer; s[ 3 ][ 8 ] = slaeufer;
- s[ 4 ][ 1 ] = wdame; s[ 4 ][ 8 ] = sdame;
- s[ 5 ][ 1 ] = wkoenig; s[ 5 ][ 8 ] = skoenig;
- s[ 6 ][ 1 ] = wlaeufer; s[ 6 ][ 8 ] = slaeufer;
- s[ 7 ][ 1 ] = wspringer; s[ 7 ][ 8 ] = sspringer;
- s[ 8 ][ 1 ] = wturm; s[ 8 ][ 8 ] = sturm;
- for( i=1; i<=8; i++ ){
- s[ i ][ 2 ] = wbauer; s[ i ][ 7 ] = sbauer;
- for( j=3; j<=6; j++ )
- s[ i ][ j ] = leer;
- }
- sp = wroch | sroch;
- }
-
- ZeichneBrett( s, weiss );
-
- SpielstaerkeAnzeige();
-
- spende = 0;
- while( 1 ) {
- e = WarteEreignis( s, weiss );
- switch( e->ereignistyp ) {
- case zugs:
- if( !spende ) {
- ZeichneStat( s, 0L );
- ZeichneZug( s, &(e->zug), weiss, &sp );
- if( IstSchach( s, schwarz, 0, sp ) )
- if( IstMatt( s, schwarz, sp ) ) {
- NotierAdd( "++" );
- NotierZug( "-Matt-" );
- spende = 1; break;
- } else
- NotierAdd( " +" );
- if( IstPatt( s, schwarz, sp ) ) {
- NotierZug( "-Patt-" );
- spende = 1; break;
- }
- zs = BesterZug( s, schwarz, Spielstaerke, sp );
- ZeichneZug( s, &(zs->zug), weiss, &sp );
- ZeichneStat( s, zs );
- if( IstSchach( s, weiss, 0, sp ) )
- if( IstMatt( s, weiss, sp ) ) {
- NotierAdd( "++" );
- NotierZug( "-Matt-" );
- spende = 1; break;
- } else
- NotierAdd( " +" );
- if( IstPatt( s, weiss, sp ) ) {
- NotierZug( "-Patt-" );
- spende = 1; break;
- }
- }
- break;
- case ende:
- if( WillBeenden( s, sp ) ) {
- SchliesseDisplay();
- exit( 0 );
- }
- break;
- }
- }
- }
-
- ZeichneZug( s, z, fa, sp )
- Figur s[ 9 ][ 9 ];
- struct Zug *z;
- Farbe fa;
- Special *sp;
- {
- char notat[ 7 ], *st;
- int sx, sy, zx, zy;
- Figur fi;
-
- /* ausführliche Notation: */
- switch( z->figur & figmask ) {
- case bauer: notat[ 0 ] = ' '; break;
- case springer: notat[ 0 ] = 'S'; break;
- case laeufer: notat[ 0 ] = 'L'; break;
- case turm: notat[ 0 ] = 'T'; break;
- case dame: notat[ 0 ] = 'D'; break;
- case koenig: notat[ 0 ] = 'K'; break;
- }
- sx = z->start >> 4; sy = z->start & yposmask;
- zx = z->ziel >> 4; zy = z->ziel & yposmask;
- notat[ 1 ] = sx-1+'a';
- notat[ 2 ] = sy+'0';
- notat[ 3 ] = s[ zx ][ zy ] == leer ? '-' : 'x';
- notat[ 4 ] = zx-1+'a';
- notat[ 5 ] = zy+'0';
- notat[ 6 ] = 0;
- st = ( notat[ 0 ] == ' ' ) ? &(notat[ 1 ]) : notat;
-
- /* Special - Variable aktualisieren: */
- *sp &= ~epmask;
- if( (z->figur&figmask)==bauer && (zy-sy==2 || sy-zy==2) )
- *sp |= sx;
- if( (z->figur&figmask)==koenig )
- if( (z->figur&farbmask)==weiss )
- *sp &= ~wroch;
- else
- *sp &= ~sroch;
- if( (z->figur&figmask)==turm )
- if( (z->figur&farbmask)==weiss ) {
- if( sx==1 )
- *sp &= ~wlroch;
- else if( sx==8 )
- *sp &= ~wkroch;
- } else
- if( sx==1 )
- *sp &= ~slroch;
- else if( sx==8 )
- *sp &= ~skroch;
-
- /* Zug ausführen */
- fi = s[zx][zy]; s[sx][sy] = leer;
- if( (z->figur&figmask)==koenig && (zx-sx==2 || sx-zx==2) ) {
- s[zx][zy] = z->figur;
- if( zx==7 ) {
- s[6][sy] = s[8][sy]; s[8][sy] = leer;
- NotierZug( "O-O" );
- } else {
- s[4][sy] = s[1][sy]; s[1][sy] = leer;
- NotierZug( "O-O-O" );
- }
- } else if( (z->figur&figmask)==bauer && fi==leer && sx!=zx ) {
- s[zx][zy] = z->figur; s[zx][sy] = leer;
- notat[3] = 'x';
- NotierZug( st );
- NotierAdd( "ep" );
- } else if( (z->figur&figmask)==bauer && (zy==1 || zy==8) ) {
- s[zx][zy] = (z->figur&farbmask)|dame;
- NotierZug( st );
- NotierAdd( "D" );
- } else {
- NotierZug( st );
- s[zx][zy] = z->figur;
- }
-
- /* Zug sichtbar machen: */
- BlinkFeld( z->start, fa );
- ZeichneFigur( leer, z->start, fa );
- ZeichneFigur( s[ zx ][ zy ], z->ziel, fa );
- if( (z->figur&figmask)==koenig && (zx-sx==2 || sx-zx==2) )
- if( zx-sx==2 ) {
- ZeichneFigur( s[8][sy], 8<<4|sy, fa );
- ZeichneFigur( s[6][sy], 6<<4|sy, fa );
- } else {
- ZeichneFigur( s[1][sy], 1<<4|sy, fa );
- ZeichneFigur( s[4][sy], 4<<4|sy, fa );
- }
- if( (z->figur&figmask)==bauer && sx!=zx )
- ZeichneFigur( s[zx][sy], zx<<4|sy, fa );
- BlinkFeld( z->ziel, fa );
- }
-